#include <MQUnifiedsensor.h>
#include "mqtt.h"
// MQ135配置
#define Board ("ESP-32")
#define Pin (34)      // GPIO36
#define Type ("MQ-135")
#define Voltage_Resolution (3.0)
#define ADC_Bit_Resolution (12)
#define RatioMQ135CleanAir (3.2)
MQUnifiedsensor MQ135(Board, Voltage_Resolution, ADC_Bit_Resolution, Pin, Type);

// 硫化物检测参数
#define a_H2S (36.737)   // H2S曲线参数a
#define b_H2S (-3.536)   // H2S曲线参数b
float R0 = 30.0;         // 需要实际校准

void calibrateH2S();

void init_mq135() {
    // 初始化MQ135
    MQ135.init();
    MQ135.setRegressionMethod(1); // 使用PPM = a*(RS/R0)^b公式

    // 设置H2S检测参数
    MQ135.setA(a_H2S); 
    MQ135.setB(b_H2S);
    MQ135.setR0(R0);

    Serial.println("MQ135 H2S检测器初始化完成");
    Serial.println("进行预热...");
}

void read_mq135() {
    static unsigned long lastCalibration = 0;
    MQ135.update(); // 更新传感器数据
    
    // 读取H2S浓度
    float h2s_ppm = MQ135.readSensor();
    
    // 动态基线校准(每24小时)
    if(millis() - lastCalibration > 24*60*60*1000) {
        calibrateH2S();
        lastCalibration = millis();
    }
    
    set_h2s(h2s_ppm);
    // 打印结果
    Serial.print("H2S浓度: ");
    Serial.print(h2s_ppm);
    Serial.println(" ppm");
}

// H2S专用校准函数
void calibrateH2S() {
    Serial.println("正在进行H2S校准...");
    float sum = 0;
    for(int i=0; i<50; i++) {
        MQ135.update();
        sum += MQ135.calibrate(RatioMQ135CleanAir);
        delay(500);
    }
    R0 = sum / 50;
    MQ135.setR0(R0);
    Serial.print("新校准R0值: ");
    Serial.println(R0);
}